<?php


namespace app\controller;
use app\model\User;
use think\facade\Db;


class UserModel
{
   public function index(){
       $user = User::find(19);
       //$user = User::select();
//       return json($user);
   }

   //插入数据
   public function insert(){
       $user = new User();
       $user->username = '加号';
       $user->password = '123';
       $user->gender = '女';
       $user->email = '123@qq.com';
       $user ->price = '12232';
       $user->details = '123';
       $user->uid='1011';
       $user->save();
//       $user->save([
//           $user->username => '加号',
//           $user->password => '123',
//           $user->gender => '女',
//           $user->email => '123aaa@qq.com',
//           $user ->price => '12232',
//           $user->details => '123',
//           $user->uid=>'1011'
//       ]);

       //使用allowField() 允许要写入的字段，其他字段无法写入
       //$user->allowField(['username','email','password'])->save(...);

       //模型新增 也提供了 replace() 方法来实现 PEPLACE INTO  新增
       //$user->replace()->save();

       //当数据新增加成功后，使用$user->id 可以获取自增ID（主键需要是id）
       //echo $user->id;

       //使用 saveAll([[...],[...]]) 添加多条数据

       //使用::create() 静态方法，来创建要新增加的数据
       //$user = User::create([],[],false);
//       $user = User::create([
//           'username' => '加号1',
//           'password' => '123',
//           'gender' => '女',
//           'email' => '123aaa@qq.com',
//           'price' => '12232',
//           'details' => '123',
//           'uid'=>'1011'
//       ]);
      //参数1：是新增加的数据 ，必选
       //参数2：是允许写入的字段，可选
       //参数3：是否为replace写入，默认false 为Insert 写入
   }

   //删除数据
    public function delete(){
       //1 使用find() 通过主键（id） 找到要删除的数据
      //再通过delete()方法，将数据删除
//        $user = User::find(305);
//        echo  $user->delete();

        //也可以使用静态方法destroy() 通过主键删除数据
//        User::destroy(1);
//        User::destroy([1,2,4]);

        //通过数据类查询删除
//        User::where('id','=','304')->delete();

        //通过闭包方式进行删除
        User::destroy(function ($query){
            $query->where('id','=',303);
        });
    }

    //数据更新
    public function update(){
       //1 使用find()获取数据，然后通过save()方法保存修改，返回布尔值
//        $user = User::find(19);
//        $user->username =  '不想学习';
//        var_dump($user->save());
        //2 通过 where()方法结合 find()方法的查询条件获取的数据，进行修改；
        //3 save() 方法只会更新变化的数据，如果提交的修改数据没有变化，则不更新
        //4 如果想要强制更新数据，即使数据一样，那么可以使用force()方法
//        $user->force()->save();
        //5 Db::raw() 执行sql函数的方式
//        $user->price  =  Db::raw('price+1');
//        $user->save();
//        return Db::getLastSql();
        //6 使用allowField()方法，允许要更新的字段，其他字段就无法写入
//        $user->allowField(['username','email'])->save(
//            [
//                'username'=>'不想干活'
//            ]
//        );
        //7 通过 saveAll()方法，可以批量修改数据，返回被修改的数据集合；
        //批量更新 saveAll() 只能通过主键id进行更新
//        $user = new User();
//        $list = [
//            ['id'=>118, 'username'=>'李白', 'email'=>'libai@163.com'],
//            ['id'=>128, 'username'=>'李白', 'email'=>'libai@163.com'],
//            ['id'=>129, 'username'=>'李白', 'email'=>'libai@163.com']
//        ];
//        $user->saveAll($list);

        //8 使用静态方法 ::update() 返回对象实例
//        User::update([
//            'username'=>'不想',
//            'price'=>100
//        ],['id'=>19],['username']);  //只更新username
//        return Db::getLastSql();


    }

    //数据查询
    public function select(){
        //1使用 find()方法，通过主键(id)查询到想要的数据； 数据不存在返回null
        //使用 findOrEmpty() 数据不存在返回空模型
        //可以使用isEmpty() 判断是不是空模型
//        $user = User::find(19);
//        return json($user);

        //2. 也可以使用 where()方法进行条件筛选查询数据；
//        $user = User::where('username','不想')->find();
//        return json($user);

        //3 使用 select([])方式，查询多条指定 id 的字段，不指定就是所有字段；
//        $user = User::select([19,20,21]);
//        foreach ($user as $key=>$obj)
//        { echo $obj->username.'<br>'; }

        //4 模型方法也可以使用 where 等连缀查询，和数据库查询方式一样；
//        $user = User::where('status',1)
//            ->limit(5)->order('id','desc')
//            ->select();
//        return json($user);

        //5 获取某个字段 value()或者某个列 column()的值；
//        echo User::where('id',19)->value('username');
//        return json(User::whereNotIn('id',[19,20,21])->column('username','id'));

        //6 模型支持动态查询：getBy*，*表示字段名；
//        return json(User::getByUsername('不想'));

        //7 . 模型支持聚合查询：max、min、sum、count、avg 等
//        echo User::max('price');

        //8 使用 chunk()方法可以分批处理数据，数据库查询时讲过，防止一次性开销过大；
//        User::chunk(5, function ($users)
//        { foreach($users as $user)
//        { echo $user->username; }
//        echo '<br>------<br>'; });

        //9 可以利用游标查询功能，可以大幅度减少海量数据的内存开销，它利用了 PHP 生 成器特性。每次查询只读一行，然后再读取时，自动定位到下一行继续读取；
//        foreach (User::where('status', 1)->cursor() as $user)
//        { echo $user->username;
//        echo '<br>------<br>'; }
   }

   //模型字段设置
    public function field(){
       //字段缓存文件  ： 直接用  php think optimize:schema
//       User::select();
//        Db::name('user')->select();
    }

    //同时定义模型获取器和动态获取器，那么动态获取器的优先级会更高
    //模型获取器
    public function getAttr(){
       $user = User::find(19);
       echo $user->status;
       echo $user->nothing;
       //当定义了获取器，并想获取原始值，可以使用getData()方法
        echo $user->getData('status');
        return json($user->getData());
    }
    //动态获取器 WithAttr
    public function withAttr(){
       $user = User::WithAttr('email',function($value){
           return strtoupper($value);
       })->find(19);
       return json($user);
    }

    //查询范围  查询范围只能使用 select() find() 两种
    public function scope(){
//       $result = User::scope('male')->select();   方法1
//        $result = User::male()->select();      //方法2

//        $result = User::scope('email','xiao')->select();
       $result = User::scope('email','xiao')->scope('price',90)->select();
      echo Db::getLastSql();
      //去掉强制查询范围
        $result = User::withoutGlobalScope(['status'])->select();
        echo Db::getLastSql();
    //       return json($result);
    }

    //使用搜索器  数据集
    public function search(){
       $result = User::withoutGlobalScope(['status'])->withSearch(['email','create_time'],[
           'email'=>'xiao',
           'create_time'=>['2014-1-1','2017-1-1'],
           'sort'=>['price'=>'asc']
       ])->where('gender','男')->select();
//       return Db::getLastSql();


        //数据集操作方法
        //使用模型方法hidden()可以隐藏某个字段，使用visible()只显示某个字段
        //是有append()可以添加某个获取器字段，使用withAttr()对字段进行夯实处理
       return json($result->hidden(['id'])->append(['nothing'])->withAttr('email',function($value){
           return strtoupper($value);
       }));
    }

    //类型转换
    public function typec(){
       $user = User::withoutGlobalScope(['status'])->find(19);
   return json($user);
       var_dump((boolean)$user->getData('status'));
       var_dump((float)$user->price);
       var_dump($user->create_time);
    }

    //软删除
    public function softDelete(){
//       User::destroy(304);
//       User::find(303)->delete();

        //开启软删除功能的前提下，使用withTrashed()方法可以取消屏蔽软删除的数据
//        $user = User::withTrashed()->select();
//        return json($user);

        //只显示出被软删除的数据
//        $user = User::onlyTrashed()->select();
//        return json($user);

        //如果想让某一条被软删除的数据恢复到正常数据，可以使用restore()方法
//        $user = User::onlyTrashed()->find(304);
//        $user->restore();

        //将一条软删除数据真正删除
        //先还原 再删除
        //User::destory(305,true)
        //$user->force()->delete();
        $user = User::onlyTrashed()->find(304);
        $user->restore();
        $user->force()->delete();


    }
}